[小ネタ] AWS IAMポリシーの Conditionで使える条件演算子 “Null” の使いみちを考える
はじめに
IAMポリシーの Condition で使える条件演算子 Null の使いみちを考えてみます。
前提知識
IAMポリシーの Condition
IAMポリシーの Condition要素 でポリシーが実行される条件を指定します。
例えば以下は 「 (EC2)リソースの Protectionタグの値が "enabled" である場合 に そのリソースの削除(Delete*)を禁止(Deny)する」 ステートメントです。
"Effect": "Deny", "Action": "ec2:Delete*", "Resource": "arn:aws:ec2:*", "Condition" : { "StringEquals" : { "aws:ResourceTag/Protection": "enabled" } }
一番シンプルな Conditionは以下のような構文です。
"Condition" : { "(条件演算子)" : { "(条件キー)" : "(条件キーの値)" } }
条件演算子 を使用して 条件キーの値と、
リクエストコンテキスト(リクエストに関する情報) の値との比較を行います。
代表的な条件演算子として 文字列の完全一致比較に使う StringEquals
や
数値の大小比較に使う NumericLessThan/NumericGreaterThan
があります。
条件キーで「何の情報と比較を行うのか」を指定します。 条件キーには サービス関係なく利用できる グローバル条件キー と、 AWSサービス固有の条件キーの 2種類あります。
例えば aws:username はグローバル条件キーで、プリンシパルのユーザー名を示しています。 ec2:Vpc はサービス固有の条件キーで、対象リソース(インスタンスやセキュリティグループ)のVPC ARNを示しています。
Null条件演算子とは
Null条件演算子 は指定した条件キーがリクエストコンテキスト(リクエストに関する情報) に 含まれているかをチェックするために使います。
Null を使うときの条件キーの値は true(キーは含まれない)
もしくは false(キーは含まれる)
です
Null の使いみち
特定の条件キーの有無で Allow/Deny したいときに使う
以下ステートメントは "一時的な認証情報 を利用した EC2 APIは許可されない" ことを表しています。
{ "Version": "2012-10-17", "Statement":{ "Action":"ec2:*", "Effect":"Allow", "Resource":"*", "Condition":{"Null":{"aws:TokenIssueTime":"true"}} } }
AWSドキュメントの 条件キーの有無をチェックする条件演算子 にある例を引用します。
ユーザーが一時的な認証情報を利用するとき のみ 、リクエストコンテキストには aws:TokenIssueTime が含まれます。 これを利用して「一時的な認証情報を使わないときのみ、 EC2 APIを許可する」ステートメントを書いています。
※ Null と true/false の組み合わせ、よく混乱することあります。以下覚えておくと良いでしょう。
- 条件キーが 有るとき の Allow/Deny を示したいときは
"Null":{"条件キー": "false"}
を使う - 条件キーが 無いとき の Allow/Deny を示したいときは
"Null":{"条件キー": "true"}
を使う
「特定の条件キーがある前提」であることを示すために使う
以下 "Protection=Enabled のタグが付いた EC2リソースを削除できないようにする" ポリシー例です。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Resource": "arn:aws:ec2:*", "Action": [ "ec2:Delete*", "ec2:Terminate*" ], "Condition": { "Null": { "aws:ResourceTag/Protection": false }, "StringEquals": { "aws:ResourceTag/Protection": "enabled" } } } ] }
※以下記事からの引用、AWS Organizations のサービスコントロールポリシー(SCP)。
このポリシーの Condition 部分で言いたいことは以下 2つです
- 「Protectionタグが存在する」前提で、
- 「Protectionタグの値が "enabled" である」
前者を Null条件演算子を使って書いています。
おわりに
今回伝えたかったことは以下です。
- 条件キーには可用性があること
- 条件キーが無いとき、評価に失敗する可能性があること
- 真面目に 「条件キーがある前提」を示すために Null条件演算子を活用できること
また、似た条件演算子に IfExists があります。 今回の記事と合わせて見てみると良いかもしれません。
参考
- AWS Documents
- DevelopersIO